package org.example.managere.service.feibiao;

import org.example.managere.dto.feibiao.AmArchivesRelationDto;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.Pageable;

import java.util.Date;
import java.util.List;
import java.util.Map;
import java.util.Optional;

/**
 * 电机标准关联服务接口
 */
public interface AmArchivesRelationService {
    
    /**
     * 保存电机标准关联
     * @param amArchivesRelationDto 电机标准关联DTO
     * @return 保存后的电机标准关联DTO
     */
    AmArchivesRelationDto save(AmArchivesRelationDto amArchivesRelationDto);
    
    /**
     * 根据ID查找电机标准关联
     * @param relationId 关联ID
     * @return 可能包含电机标准关联的Optional
     */
    Optional<AmArchivesRelationDto> findById(Integer relationId);
    
    /**
     * 更新电机标准关联
     * @param amArchivesRelationDto 电机标准关联DTO
     * @return 更新后的电机标准关联DTO
     */
    AmArchivesRelationDto update(AmArchivesRelationDto amArchivesRelationDto);
    
    /**
     * 删除电机标准关联
     * @param relationId 关联ID
     */
    void deleteById(Integer relationId);
    
    /**
     * 查找所有电机标准关联
     * @return 电机标准关联DTO列表
     */
    List<AmArchivesRelationDto> findAll();
    
    /**
     * 分页查询电机标准关联
     * @param pageable 分页参数
     * @return 电机标准关联DTO分页结果
     */
    Page<AmArchivesRelationDto> findAll(Pageable pageable);
    
    /**
     * 根据电机ID查询标准关联
     * @param motorId 电机ID
     * @return 电机标准关联DTO列表
     */
    List<AmArchivesRelationDto> findByMotorId(String motorId);
    
    /**
     * 根据电机ID分页查询标准关联
     * @param motorId 电机ID
     * @param pageable 分页参数
     * @return 电机标准关联DTO分页结果
     */
    Page<AmArchivesRelationDto> findByMotorId(String motorId, Pageable pageable);
    
    /**
     * 根据标准类型查询标准关联
     * @param standardType 标准类型
     * @return 电机标准关联DTO列表
     */
    List<AmArchivesRelationDto> findByStandardType(String standardType);
    
    /**
     * 根据标准类型分页查询标准关联
     * @param standardType 标准类型
     * @param pageable 分页参数
     * @return 电机标准关联DTO分页结果
     */
    Page<AmArchivesRelationDto> findByStandardType(String standardType, Pageable pageable);
    
    /**
     * 根据标准值查询标准关联
     * @param standardValue 标准值
     * @return 电机标准关联DTO列表
     */
    List<AmArchivesRelationDto> findByStandardValue(String standardValue);
    
    /**
     * 根据标准值分页查询标准关联
     * @param standardValue 标准值
     * @param pageable 分页参数
     * @return 电机标准关联DTO分页结果
     */
    Page<AmArchivesRelationDto> findByStandardValue(String standardValue, Pageable pageable);
    
    /**
     * 根据关联日期范围查询标准关联
     * @param startDate 开始日期
     * @param endDate 结束日期
     * @return 电机标准关联DTO列表
     */
    List<AmArchivesRelationDto> findByDateRange(Date startDate, Date endDate);
    
    /**
     * 查询特定电机和标准类型的关联
     * @param motorId 电机ID
     * @param standardType 标准类型
     * @return 可能包含电机标准关联的Optional
     */
    Optional<AmArchivesRelationDto> findByMotorIdAndStandardType(String motorId, String standardType);
    
    /**
     * 查询所有唯一的标准类型
     * @return 标准类型列表
     */
    List<String> findAllStandardTypes();
    
    /**
     * 查询所有唯一的标准值
     * @return 标准值列表
     */
    List<String> findAllStandardValues();
    
    /**
     * 查询满足指定标准类型和值的所有电机ID
     * @param standardType 标准类型
     * @param standardValue 标准值
     * @return 电机ID列表
     */
    List<String> findMotorIdsByStandardTypeAndValue(String standardType, String standardValue);
    
    /**
     * 按照标准类型分组统计数量
     * @return 包含标准类型和数量的Map
     */
    Map<String, Long> countByStandardType();
    
    /**
     * 统计每个电机满足的标准数量
     * @return 包含电机ID和数量的Map
     */
    Map<String, Long> countStandardsByMotorId();
    
    /**
     * 检查特定电机是否符合指定标准
     * @param motorId 电机ID
     * @param standardType 标准类型
     * @return 是否符合标准
     */
    boolean checkMotorMeetsStandard(String motorId, String standardType);
    
    /**
     * 根据电机ID和标准类型删除关联
     * @param motorId 电机ID
     * @param standardType 标准类型
     */
    void deleteByMotorIdAndStandardType(String motorId, String standardType);
    
    /**
     * 根据电机ID删除所有关联
     * @param motorId 电机ID
     */
    void deleteAllByMotorId(String motorId);
    
    /**
     * 根据标准代码查询关联
     *
     * @param standardCode 标准代码
     * @return 标准关联列表
     */
    List<AmArchivesRelationDto> findByStandardCode(String standardCode);
    
    /**
     * 根据标准代码分页查询关联
     *
     * @param standardCode 标准代码
     * @param pageable 分页参数
     * @return 标准关联分页结果
     */
    Page<AmArchivesRelationDto> findByStandardCode(String standardCode, Pageable pageable);

    /**
     * 根据合规状态查询关联
     *
     * @param complianceStatus 合规状态
     * @return 标准关联列表
     */
    List<AmArchivesRelationDto> findByComplianceStatus(String complianceStatus);
} 